package com.atguigu.jxc.service.impl;

import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.entity.Goods;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.entity.Log;
import com.atguigu.jxc.service.GoodsService;
import com.atguigu.jxc.service.GoodsTypeService;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @program: jxc
 * @description:
 * @author: SXC
 * @create: 2021-09-04 16:43
 **/
@Service
public class GoodsTypeServiceImpl implements GoodsTypeService {


    @Autowired
    private GoodsTypeDao goodsTypeDao;

    @Override
    public String loadGoodsType() {
        return this.getAllGoodsType(-1).toString();// 根节点默认从-1开始
    }

    /**
     * 查询商品所有分类
     * @param parentId
     * @return
     */
    public JsonArray getAllGoodsType(Integer parentId){

        JsonArray array = this.getGoodsTypeByParentId(parentId);

        for(int i = 0;i < array.size();i++){

            JsonObject obj = (JsonObject) array.get(i);

            if(obj.get("state").getAsString().equals("open")){//如果是叶子节点，不再递归

                continue;

            }else{//如果是根节点，继续递归查询

                obj.add("children", this.getAllGoodsType(obj.get("id").getAsInt()));
            }
        }
        return array;
    }

    /**
     * 根据父菜单ID获取菜单
     * @return
     */
    public JsonArray getGoodsTypeByParentId(Integer parentId){

        JsonArray array = new JsonArray();

        List<GoodsType> goodsTypes = goodsTypeDao.getGoodsTypeByParentId(parentId);

        //遍历菜单
        for(GoodsType goodsType : goodsTypes){

            JsonObject obj = new JsonObject();
            //TODO
            obj.addProperty("id", goodsType.getGoodsTypeId());// 菜单ID

            obj.addProperty("text", goodsType.getGoodsTypeName());// 菜单名称


            if(goodsType.getGoodsTypeState() == 1) {
                obj.addProperty("state", "closed"); // 根节点

            }else{
                obj.addProperty("state", "open");// 叶子节点
            }

            JsonObject attributes = new JsonObject(); //扩展属性

            attributes.addProperty("state", goodsType.getGoodsTypeState());

            obj.add("attributes", attributes);

            array.add(obj);
        }
        return array;
    }


    /**
     * 新增分类
     * @param goodsTypeName
     * @param pId
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void save(String goodsTypeName, Integer pId) {
        GoodsType goodsType = new GoodsType();
        goodsType.setGoodsTypeName(goodsTypeName);
        goodsType.setPId(pId);

        if ( pId == 1 || pId == -1){
            goodsType.setGoodsTypeState(1);
        }else {
            goodsType.setGoodsTypeState(0);
        }
        goodsTypeDao.save(goodsType);
        goodsTypeDao.update(pId,1);
    }

    /**
     * 删除分类
     * @param goodsTypeId
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void delete(Integer goodsTypeId) {
        GoodsType goodsType =  goodsTypeDao.getGoodsTypeById(goodsTypeId);
        if ( goodsType != null){
            if (goodsType.getGoodsTypeState() == 1) {
                return;
            }else {
                goodsTypeDao.delete(goodsTypeId);
                //根据pid获取是否是否有数据
                List<GoodsType> goodsTypeList  =  goodsTypeDao.getGoodsTypeByParentId(goodsType.getPId());
                //是否有数据没有数据就降级
                if(CollectionUtils.isEmpty(goodsTypeList)){
                    //降级处理
                    goodsTypeDao.update(goodsType.getPId(),0);
                }
            }
        }
    }
}
